home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / security / netlog-1.02 / extract / builder.c next >
Encoding:
C/C++ Source or Header  |  1993-04-20  |  2.4 KB  |  141 lines

  1. /*
  2.      extract - A network log processor
  3.      Copyright (C) 1993 Douglas Lee Schales, David K. Hess, David R. Safford
  4.  
  5.      Please see the file `COPYING' for the complete copyright notice.
  6.  
  7. builder.c - 03/20/93
  8.  
  9. */
  10. #include <stdio.h>
  11. #include <malloc.h>
  12. #include "stdunix.h"
  13.  
  14. #include "parser.h"
  15. #include "builder.h"
  16.  
  17. static struct parsenode *stack = 0;
  18. int parse_error = 0;
  19.  
  20. struct parsenode *
  21. popnode(void)
  22. {
  23.      struct parsenode *result;
  24.  
  25.      if(!stack){
  26.       fprintf(stderr, "Parse tree stack underflow\n");
  27.       exit(1);
  28.      }
  29.      result = stack;
  30.      stack = result->next;
  31.  
  32.      return result;
  33. }
  34.  
  35. void
  36. pushval(unsigned long val)
  37. {
  38.      struct parsenode *node;
  39.      node = (struct parsenode *)malloc(sizeof(struct parsenode));
  40.  
  41.      node->nodetype = VAL;
  42.      node->nodeval = val;
  43.      node->next = stack;
  44.      stack = node;
  45. }
  46.  
  47. void
  48. pushkey(unsigned key)
  49. {
  50.      struct parsenode *node;
  51.      node = (struct parsenode *)malloc(sizeof(struct parsenode));
  52.      
  53.      node->nodetype = KEY;
  54.      node->nodeval = key;
  55.      node->next = stack;
  56.      stack = node;
  57. }
  58.  
  59. void
  60. pushoper(unsigned int oper)
  61. {
  62.      struct parsenode *node;
  63.  
  64.      node = (struct parsenode *)malloc(sizeof(struct parsenode));
  65.  
  66.      node->nodetype = OPER;
  67.      node->nodeval = oper;
  68.      node->rhs = popnode();
  69.      node->lhs = popnode();
  70.  
  71.      node->next = stack;
  72.      stack = node;
  73. }
  74.  
  75. void
  76. pushuoper(unsigned int oper)
  77. {
  78.      struct parsenode *node;
  79.  
  80.      node = (struct parsenode *)malloc(sizeof(struct parsenode));
  81.  
  82.      node->nodetype = UOPER;
  83.      node->nodeval = oper;
  84.      node->rhs = popnode();
  85.  
  86.      node->next = stack;
  87.      stack = node;
  88. }
  89.  
  90. struct actionlist *ahead = 0, *atail = 0;
  91.  
  92. void
  93. queueact(int action)
  94. {
  95.      struct actionlist *anode;
  96.      
  97.      anode = (struct actionlist *)malloc(sizeof(struct actionlist));
  98.      anode->action = action;
  99.      anode->next = 0;
  100.      if(atail)
  101.       atail->next = anode;
  102.      else
  103.       ahead = anode;
  104.      atail = anode;
  105. }
  106.  
  107. struct parsetree *phead = 0, *ptail = 0;
  108.  
  109. void
  110. queuestmt(void)
  111. {
  112.      struct parsetree *pt;
  113.  
  114.      pt = (struct parsetree *)malloc(sizeof(struct parsetree));
  115.      
  116.      pt->conditions = stack;
  117.      pt->actions = ahead;
  118.      pt->next = 0;
  119.      ahead = atail = 0;
  120.      stack = 0;
  121.  
  122.      if(ptail)
  123.       ptail->next = pt;
  124.      else
  125.       phead = pt;
  126.      ptail = pt;
  127. }
  128.  
  129. struct parsetree *
  130. parse(void)
  131. {
  132.      extern void yyparse(void);
  133.      parse_error = 0;
  134.  
  135.      yyparse();
  136.      if(!parse_error)
  137.       return phead;
  138.      else
  139.       return 0;
  140. }
  141.